package com.sky.task;

import com.alibaba.fastjson.JSON;
import com.sky.mapper.common.OrderMapper;
import com.sky.pojo.Orders;
import com.sky.properties.WeChatProperties;
import com.sky.service.user.WxPayService;
import com.sky.websocket.WebSocketServer;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private WeChatProperties weChatProperties;

    @Autowired
    private CloseableHttpClient httpClient;

    @Autowired
    private WxPayService wxPayService;

    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * 哪些订单算是超时的订单？
     *  订单下单时间  < 当前时间的订单 - 15分钟 并且支付状态为待支付
     *
     *  PostConstruct注解的作用：
     *      当springioc容器创建了该对象以后马上就会调用该方法来完成对象的初始化
     */
//    @Scheduled(cron = "0 0/1 * * * ?")
//    @PostConstruct
    public void processTimeoutOrder() throws Exception {
        log.info("定时查询未知支付的订单的任务执行了");

        //1. 获取当前时间 并且减去15分钟
        /*Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE, -15);*/
        LocalDateTime dateTime = LocalDateTime.now().plusMinutes(-15);

        //2. 通过支付状态和当前时间 并且减去15分钟的时间查询已经超时订单
        List<Orders> list = orderMapper.selectByStatusAndTime(dateTime, Orders.PENDING_PAYMENT);

        //3. 判断是否有超时的 如果有 则调用微信的接口关闭支付订单 然后更新订单表的状态
        if(null != list && list.size() > 0){
            for (Orders orders : list) {
                /**
                 * 在关闭订单的时候可能出现的情况：
                 *  1. 用户先支付了 然后你在关闭订单 -> 关闭订单会失败 会返回false
                 *  2. 你先执行关闭订单 然后用户在支付 -> 用户支付不会成功
                 *  3. 如果你和用户同时并发执行 -> 微信内部会保证他的并发性
                 */
                wxPayService.CloseOrder(orders.getNumber());

                orders.setStatus(Orders.CANCELLED_ORDER);
                orders.setCancelTime(LocalDateTime.now());
                orders.setCancelReason("订单超时未支付 取消订单");

                orderMapper.updateById(orders);

            }
        }
    }


//    @Scheduled(cron = "0/3 * * * * ?")
    public void processOrderPayStatus() throws Exception {
        log.info("定时查询订单的支付状态....");
        //select * from order where  order_time > 当前时间-15 and status = 1
        //1. 查询过去15分钟下单 且未支付的所有的订单
        LocalDateTime dateTime = LocalDateTime.now().plusMinutes(-15);
        List<Orders> list = orderMapper.selectByStatusAndBeginTime(dateTime, Orders.PENDING_PAYMENT);

        //2. 判断是否有订单 如果有则遍历 然后发送请求询问微信订单的支付结果 如果为以支付则更新订单的状态 如果是未支付则不处理
        if(null != list && list.size() > 0){
            for (Orders orders : list) {
                //然后发送请求询问微信订单的支付结果
                Boolean flag = wxPayService.QueryOrder(orders);
                if(flag){
                    //如果为以支付则更新订单的状态
                    orders.setStatus(Orders.TO_BE_CONFIRMED);
                    orders.setCheckoutTime(LocalDateTime.now());
                    orders.setPayStatus(Orders.PAID);
                    orderMapper.updateByOutTradeNo(orders);

                    //发送消息通知商家有用户下单了
                    Map<String,Object> map = new HashMap<>();
                    map.put("type", "2");
                    map.put("orderId", orders.getId());
                    map.put("content", "客户下单了 请及时处理");

                    webSocketServer.sendToAllClient(JSON.toJSONString(map));
                }

            }
        }

    }
}
